# cmake最低版本要求
cmake_minimum_required(VERSION 3.5)

# 项目名称
project(navmesh)

# CMAKE_CXX_FLAGS用于存储全局的C++编译器标志，为整个项目设置默认的编译选项，是个内置变量。-m64表示生成64位系统下的代码
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")

# 定义工程根目录为CMakeLists.txt文件所在的路径
SET(ROOT_DIR ${CMAKE_SOURCE_DIR})

# GLUT_DIR = freeglut库所在的目录
if(MSVC)
    message("Using MSVC compiler")
    SET(GLUT_DIR ${ROOT_DIR}/libs/freeglut_msvc)
elseif(MINGW)
    message("Using MinGW compiler")
    SET(GLUT_DIR ${ROOT_DIR}/libs/freeglut_mingw)
else()
    # FATAL_ERROR选项会终止cmake的运行
    message(FATAL_ERROR "Using an unknown compiler.")
endif()

# 解决vs SAFESEH报错
# set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB:glut32.lib")

# file(GLOB ...) 搜索并生成文件列表。收集"src/"路径下的.cpp文件形成文件列表赋值给变量SOURCES
file(GLOB SOURCES "src/*.cpp")

# 指定要生成的可执行文件和其源文件
add_executable(${PROJECT_NAME} ${SOURCES})

# 为指定目标添加公共头文件搜索路径
target_include_directories(${PROJECT_NAME}
    PUBLIC
    ${ROOT_DIR}/libs/freeglut_msvc/include
)

# 如果你电脑上的mingw已经通过pacman命令安装了freeglut库，并把路径mingw64/bin/添加到了环境变量Path中，那么你可以屏蔽这一段cmake设置
# 添加freeglut库；STATIC表示这是静态的库；IMPORTED表示已经编译好了，不需要cmake编译它
add_library(freeglut STATIC IMPORTED)
if(MSVC)
    # 为目标freeglut设置IMPORTED_LOCATION属性，IMPORTED_LOCATION用于指定预编译的库文件的位置
    set_property(TARGET freeglut PROPERTY IMPORTED_LOCATION ${GLUT_DIR}/lib/x64/freeglut.lib)
elseif(MINGW)
    set_property(TARGET freeglut PROPERTY IMPORTED_LOCATION ${GLUT_DIR}/lib/x64/libfreeglut.a)
endif()

# 为目标navmesh链接freeglut、opengl32、glu32库
target_link_libraries(${PROJECT_NAME} freeglut opengl32 glu32) # 添加freeglut.lib

# EXECUTABLE_OUTPUT_PATH = ./bin
set(EXECUTABLE_OUTPUT_PATH ${ROOT_DIR}/bin)

# 只是为了防止navmesh.exe执行时索引不到freeglut.dll，如果你电脑上的mingw已经通过pacman命令安装了freeglut库，这段代码可以屏蔽
if(MSVC)
    # 将动态链接库freeglut.dll复制到DESTINATION指定的路径中
    file(COPY ${GLUT_DIR}/bin/x64/freeglut.dll DESTINATION ${EXECUTABLE_OUTPUT_PATH}/Release)
    file(COPY ${GLUT_DIR}/bin/x64/freeglut.dll DESTINATION ${EXECUTABLE_OUTPUT_PATH}/Debug)
elseif(MINGW)
    file(COPY ${GLUT_DIR}/bin/x64/freeglut.dll DESTINATION ${EXECUTABLE_OUTPUT_PATH})
endif()
